from PIL import Image, ImageDraw, ImageFont
import os




def generate_emotion_image(
    base_img_path,
    keywords,  # 四个关键字，列表形式
    score,      # 可信赖分数，0-100
    summary     # 总结文本（支持长文本自动折行）
):
    # 1. 加载底图模板
    img = Image.open(base_img_path).convert("RGB")
    draw = ImageDraw.Draw(img)
    # 2. 配置字体（确保字体存在，大小固定为14）
    font_path = os.path.join("static", "fonts", "Dymon-ShouXieTi.otf")  # 字体路径
    try:
        text_font = ImageFont.truetype(font_path, 14)  # 固定14号字体（总结、关键字等共用）
        star_font = ImageFont.truetype(font_path, 20)  # 星级字体
    except OSError:
        #  fallback到系统字体，确保中文显示
        # text_font = ImageFont.truetype("C:/Windows/Fonts/simkai.ttf", 14)
        text_font = ImageFont.truetype(r"E:\project\nobad\test\Dymon-ShouXieTi.otf", 14)
        star_font = ImageFont.truetype(r"E:\project\nobad\test\Dymon-ShouXieTi.otf", 20)
    # 3. 定义元素坐标（根据底图调整）
    keyword_positions = [
        (220, 145),  # 蓝色进度条上方
        (220, 185),  # 绿色进度条上方
        (220, 225),  # 橙色进度条上方
        (220, 265),  # 深蓝色进度条上方
    ]
    score_pos = (25, 360)       # 分数位置
    star_pos = (25, 380)        # 星级位置
    summary_start_pos = (25, 420)  # 总结起始位置
    max_summary_width = 260     # 总结最大宽度（像素，根据底图空间调整）
    line_spacing = 5            # 行间距（像素，可微调）
    # 4. 绘制四个关键字
    for i, keyword in enumerate(keywords[:4]):
        draw.text(keyword_positions[i], keyword, font=text_font, fill=(0, 0, 0))
    # 5. 绘制可信赖分数
    score_text = f"可信赖分数值：{score}"
    draw.text(score_pos, score_text, font=text_font, fill=(0, 0, 0))
    # 6. 绘制星级
    star_count = min(5, max(1, (score + 19) // 20))  # 优化分数→星级计算
    star_chars = "★" * star_count + "☆" * (5 - star_count)
    draw.text(star_pos, star_chars, font=star_font, fill=(255, 204, 0))
    # 7. 总结文本折行处理（核心优化：适配中文，保留"总结："前缀）
    # 7.1 拼接"总结："前缀
    full_summary = f"总结：{summary}"
    # 7.2 按字符拆分（适配中文无空格的情况）
    chars = list(full_summary)  # 把文本拆成单个字符
    lines = []
    current_line = ""
    for char in chars:
        # 测试当前行+新字符的宽度
        test_line = current_line + char
        if draw.textlength(test_line, font=text_font) <= max_summary_width:
            current_line = test_line
        else:
            # 超过最大宽度，换行
            lines.append(current_line)
            current_line = char  # 新字符作为下一行开头
    if current_line:  # 添加最后一行
        lines.append(current_line)

    # 7.3 逐行绘制总结（字体保持14号，行高=字体高度+行间距）
    y = summary_start_pos[1]
    font_height = text_font.getbbox("测")[3]  # 获取单个字的高度（固定）
    for line in lines:
        draw.text((summary_start_pos[0], y), line, font=text_font, fill=(0, 0, 0))
        y += font_height + line_spacing  # 下一行y坐标 = 当前y + 字高 + 行间距


    # 8. 保存图片
    output_path = "emotion_test_result.jpg"
    img.save(output_path, "JPEG", quality=95)
    return output_path

if __name__ == "__main__":
    base_template = "man_score_100.png"
    test_keywords = ['咋了11', '脑瓜子11', '情感沟通', '日常吐槽']
    test_score = 50
    # 超长总结文本测试
    test_summary = "这个人总体看起来还不错，这是两组微信聊天记录，涉及约会后的情绪询问与日常琐事吐槽."
    generate_emotion_image(base_template, test_keywords, test_score, test_summary)

